home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
- #
- # svgakeymap - by Brion Vibber (brion@pobox.com), 6/30 - 7/3/1998
- # Generates a keymap conversion file for svgalib from two keytable definitions.
- #
- # Usage:
- # svgakeymap [physical_map [program_map]] > output.keymap
- #
- # The conversion map is output to stdout; you may wish to redirect it.
- # Keymaps are searched for in /usr/lib/kbd/keytables and are automatically
- # filtered through gzip if necessary.
- #
- # Read the file README.keymap from the svgalib distribution for more info.
-
- $ktd = "/usr/lib/kbd/keytables/";
- if(scalar(@ARGV) > 0) {
- $inmap = $ARGV[0];
- } else {
- $inmap = "us";
- }
- if(scalar(@ARGV) > 1) {
- $outmap = $ARGV[1];
- } else {
- $outmap = $inmap;
- }
-
-
- foreach $bob ($inmap, $outmap) {
- #print "$bob\n";
- unless(-e $bob) {
- # Tack the keytable dir on it
- $bob = $ktd . $bob;
- #print "$bob\n";
-
- unless(-e $bob) {
- # Tack a .gz on it
- $bob .= ".map";
- #print "$bob\n";
-
- unless(-e $bob) {
- # Tack a .gz on it
- $bob .= ".gz";
- #print "$bob\n";
-
- unless(-e $bob) {
- die "Couldn't find $bob\n.";
- }
- }
- }
- }
- }
-
- if($inmap =~ m/\.gz$/) {
- # Filter thru gzip
- open INMAP, "gzip -dc $inmap |" or die "Could not open $inmap!\n";
- } else {
- open INMAP, "<$inmap" or die "Could not open $inmap!\n";
- }
-
- if($outmap =~ m/\.gz$/) {
- # Filter thru gzip
- open OUTMAP, "gzip -dc $outmap |" or die "Could not open $outmap!\n";
- } else {
- open OUTMAP, "<$outmap" or die "Could not open $outmap!\n";
- }
-
- print "# This is a svgalib scancode conversion map generated by svgakeymap.\n",
- "# Read the file README.keymap from the svgalib distribution for more info.\n#\n",
- "# Physical keyboard layout: $inmap\n",
- "# Program's expected keyboard layout: $outmap\n#\n",
- "# physical_scancode program_scancode key_name\n";
-
-
- while($kc = <OUTMAP>) {
- if($kc =~ m/^keycode\s+([0-9]+)\s*\=\s*(\S+)/) {
- # Store scancodes and names for future reference
- #print stderr "- $1 - $2 -\n";
- $keys{$1} = $2;
- $keys{$2} = $1;
- } else {
- # We ignore anything else - including modifiers
- }
- }
-
- while($kc = <INMAP>) {
- if($kc =~ m/^keycode\s+([0-9]+)\s*\=\s*(\S+)/) {
- if($keys{$2}) {
- # Matching scancodes!
- #unless($keys{$1} eq $2) {
- # Find the other code with the same key...
- #print "$1 $keys{$2}\t# $keys{$1} <-> $2\n";
- #print "$1 $keys{$2}\t# $2\n";
- print "$1 $keys{$2} $2\n";
- #}
- }
- }
- }
-
-